package FanXingT;

/**
 * @author Ajie
 * @date 2019-11-27
 * @function
 *
 * observer.onUpdate(t) 这个地方就类似于把T类型，放到observer的盘子里，所以命中了第二条规则，
 * 因此使用<? super T>，如果把这里的代码改成 extends，编译器是会报错的。
 *
 * 大神讲解观察者模式，手撕 Rxjava ！！！
 *
 * 链接：https://www.jianshu.com/p/9313a7887a1d
 *
 * @see ObjectTool 泛型有三种使用方式，分别为：泛型类、泛型接口、泛型方法
 *
 */
public class RxJavaFanxing {

    public static void main(String[] args) {
        Observable<String> stringObservable = new Observable<String>("str");
        stringObservable.subscribe(new Observer<String>() {
            @Override
            public void onUpdate(String s) {

            }
        });
    }

}

// Observer.java
// 观察者
interface Observer<T> {
    void onUpdate(T t);
}

// ObservableSource.java
// 被观察者(主题)接口
interface ObservableSource<T> {
    void subscribe(Observer<? super T> observer);
}

// Observable.java
// 具体的被观察者(主题)
class Observable<T> implements ObservableSource<T> {
    private T t;
    public Observable(T t) {
        this.t = t;
    }
    @Override
    public void subscribe(Observer<? super T> observer) {

        // 调用订阅时,触发观察者更新
        observer.onUpdate(t);
    }
}

